home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / scitech / mgl11 / examples / testgr.c < prev    next >
Encoding:
Text File  |  1994-03-10  |  45.2 KB  |  1,491 lines

  1. indVesaMode(xsize,ysize,24);
  2.     END;
  3.     IF mode = 0 THEN BEGIN
  4.         WriteLn('No such mode could be found !');
  5.         WriteLn('Switching to to 320x200.');
  6.         ReadKey;
  7.         mode := V320x200x256;
  8.     END;
  9. END;
  10.  
  11. begin { program body }
  12.   SelectMode;
  13.   Initialize;
  14.   ReportStatus;
  15.  
  16. {  AspectRatioPlay; }
  17.   FillEllipsePlay;
  18.   SectorPlay;
  19.   WriteModePlay;
  20.  
  21.   ColorPlay;
  22.   { PalettePlay only intended to work on these drivers: }
  23.   if (GraphDriver = EGA) or
  24.       (GraphDriver = EGA64) or
  25.       (GraphDriver = VGA) then
  26.      PalettePlay;
  27.   PutPixelPlay;
  28. {  PutImagePlay; }
  29.   RandBarPlay;
  30.   BarPlay;
  31.   Bar3DPlay;
  32.   ArcPlay;
  33.   CirclePlay;
  34.   PiePlay;
  35.   LineToPlay;
  36.   LineRelPlay;
  37. {  LineStylePlay; }
  38. {  UserLineStylePlay; }
  39.   TextDump;
  40.   TextPlay;
  41.   CrtModePlay;
  42.   FillStylePlay;
  43.   FillPatternPlay;
  44.   PolyPlay;
  45.   SayGoodbye;
  46. {  CloseGraph; }
  47.   CloseVesa;
  48. end.
  49. ***************************************************
  50.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  51.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩
  52. ¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·
  53. Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  54. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  55. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  56.     Color := RandColor;
  57.     SetColor(Color);
  58.     SetFillStyle(Random(CloseDotFill)+1, Color);
  59.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  60.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  61.   until KeyPressed;
  62.   WaitToGo;
  63. end; { RandBarPlay }
  64.  
  65. procedure ArcPlay;
  66. { Draw random arcs on the screen }
  67. var
  68.   MaxRadius : word;
  69.   EndAngle : word;
  70.   ArcInfo : ArcCoordsType;
  71. begin
  72.   MainWindow('Arc / GetArcCoords demonstration');
  73.   StatusLine('Esc aborts or press a key');
  74.   MaxRadius := MaxY div 10;
  75.   repeat
  76.     SetColor(RandColor);
  77.     EndAngle := Random(360);
  78.     SetLineStyle(SolidLn, 0, NormWidth);
  79.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  80.     GetArcCoords(ArcInfo);
  81.     with ArcInfo do
  82.     begin
  83.       Line(X, Y, XStart, YStart);
  84.       Line(X, Y, Xend, Yend);
  85.     end;
  86.   until KeyPressed;
  87.   WaitToGo;
  88. end; { ArcPlay }
  89.  
  90. procedure PutPixelPlay;
  91. { Demonstrate the PutPixel and GetPixel commands }
  92. const
  93.   Seed   = 1962; { A seed for the random number generator }
  94.   NumPts = 2000; { The number of pixels plotted }
  95.   Esc    = #27;
  96. var
  97.   I : word;
  98.   X, Y, Color : word;
  99.   XMax, YMax  : integer;
  100.   ViewInfo    : ViewPortType;
  101. begin
  102.   MainWindow('PutPixel / GetPixel demonstration');
  103.   StatusLine('Esc aborts or press a key...');
  104.  
  105.   GetViewSettings(ViewInfo);
  106.   with ViewInfo do
  107.   begin
  108.     XMax := (x2-x1-1);
  109.     YMax := (y2-y1-1);
  110.   end;
  111.  
  112.   while not KeyPressed do
  113.   begin
  114.     { Plot random pixels }
  115.     RandSeed := Seed;
  116.     I := 0;
  117.     while (not KeyPressed) and (I < NumPts) do
  118.     begin
  119.       Inc(I);
  120.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  121.     end;
  122.  
  123.     { Erase pixels }
  124.     RandSeed := Seed;
  125.     I := 0;
  126.     while (not KeyPressed) and (I < NumPts) do
  127.     begin
  128.       Inc(I);
  129.       X := Random(XMax)+1;
  130.       Y := Random(YMax)+1;
  131.       Color := GetPixel(X, Y);
  132.         if Color = RandColor then
  133.           PutPixel(X, Y, 0);
  134.      end;
  135.   end;
  136.   WaitToGo;
  137. end; { PutPixelPlay }
  138.  
  139. procedure PutImagePlay;
  140. { Demonstrate the GetImage and PutImage commands }
  141.  
  142. const
  143.   r  = 20;
  144.   StartX = 100;
  145.   StartY = 50;
  146.  
  147. var
  148.   CurPort : ViewPortType;
  149.  
  150. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  151. var
  152.   Step : integer;
  153. begin
  154.   Step := Random(2*r);
  155.   if Odd(Step) then
  156.     Step := -Step;
  157.   X := X + Step;
  158.   Step := Random(r);
  159.   if Odd(Step) then
  160.     Step := -Step;
  161.   Y := Y + Step;
  162.  
  163.   { Make saucer bounce off viewport walls }
  164.   with CurPort do
  165.   begin
  166.     if (x1 + X + Width - 1 > x2) then
  167.       X := x2-x1 - Width + 1
  168.     else
  169.       if (X < 0) then
  170.         X := 0;
  171.     if (y1 + Y + Height - 1 > y2) then
  172.       Y := y2-y1 - Height + 1
  173.     else
  174.       if (Y < 0) then
  175.         Y := 0;
  176.   end;
  177. end; { MoveSaucer }
  178.  
  179. var
  180.   Pausetime : word;
  181.   Saucer    : pointer;
  182.   X, Y      : integer;
  183.   ulx, uly  : word;
  184.   lrx, lry  : word;
  185.   Size      : word;
  186.   I         : word;
  187. begin
  188.   ClearDevice;
  189.   FullPort;
  190.  
  191.   { PaintScreen }
  192.   ClearDevice;
  193.   MainWindow('GetImage / PutImage Demonstration');
  194.   StatusLine('Esc aborts or press a key...');
  195.   GetViewSettings(CurPort);
  196.  
  197.   { DrawSaucer }
  198.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  199.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  200.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  201.   Circle(StartX+10, StartY-12, 2);
  202.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  203.   Circle(StartX-10, StartY-12, 2);
  204.   SetFillStyle(SolidFill, MaxColor);
  205.   FloodFill(StartX+1, StartY+4, GetColor);
  206.  
  207.   { ReadSaucerImage }
  208.   ulx := StartX-(r+1);
  209.   uly := StartY-14;
  210.   lrx := StartX+(r+1);
  211.   lry := StartY+(r div 3)+3;
  212.  
  213.   Size := ImageSize(ulx, uly, lrx, lry);
  214.   GetMem(Saucer, Size);
  215.   GetImage(ulx, uly, lrx, lry, Saucer^);
  216. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  217.  
  218.   { Plot some "stars" }
  219.   for I := 1 to 1000 do
  220.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  221.   X := MaxX div 2;
  222.   Y := MaxY div 2;
  223.   PauseTime := 70;
  224.  
  225.   { Move the saucer around }
  226.   repeat
  227. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  228.      Delay(PauseTime);
  229. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  230.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  231.   until KeyPressed;
  232.   FreeMem(Saucer, size);
  233.   WaitToGo;
  234. end; { PutImagePlay }
  235.  
  236. procedure PolyPlay;
  237. { Draw random polygons with random fill styles on the screen }
  238. const
  239.   MaxPts = 5;
  240. type
  241.   PolygonType = array[1..MaxPts] of PointType;
  242. var
  243.   Poly : PolygonType;
  244.   I, Color : word;
  245. begin
  246.   MainWindow('FillPoly demonstration');
  247.   StatusLine('Esc aborts or press a key...');
  248.   repeat
  249.     Color := RandColor;
  250.     SetFillStyle(Random(11)+1, Color);
  251.     SetColor(Color);
  252.     for I := 1 to MaxPts do
  253.       with Poly[I] do
  254.       begin
  255.         X := Random(MaxX);
  256.         Y := Random(MaxY);
  257.       end;
  258.     FillPoly(MaxPts, Poly);
  259.   until KeyPressed;
  260.   WaitToGo;
  261. end; { PolyPlay }
  262.  
  263. procedure FillStylePlay;
  264. { Display all of the predefined fill styles available }
  265. var
  266.   Style    : word;
  267.   Width    : word;
  268.   Height   : word;
  269.   X, Y     : word;
  270.   I, J     : word;
  271.   ViewInfo : ViewPortType;
  272.  
  273. procedure DrawBox(X, Y : word);
  274. begin
  275.   SetFillStyle(Style, MaxColor);
  276.   with ViewInfo do
  277.     Bar(X, Y, X+Width, Y+Height);
  278.   Rectangle(X, Y, X+Width, Y+Height);
  279.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  280.   Inc(Style);
  281. end; { DrawBox }
  282.  
  283. begin
  284.   MainWindow('Pre-defined fill styles');
  285.   GetViewSettings(ViewInfo);
  286.   with ViewInfo do
  287.   begin
  288.     Width := 2 * ((x2+1) div 13);
  289.     Height := 2 * ((y2-10) div 10);
  290.   end;
  291.   X := Width div 2;
  292.   Y := Height div 2;
  293.   Style := 0;
  294.   for J := 1 to 3 do
  295.   begin
  296.     for I := 1 to 4 do
  297.     begin
  298.       DrawBox(X, Y);
  299.       Inc(X, (Width div 2) * 3);
  300.     end;
  301.     X := Width div 2;
  302.     Inc(Y, (Height div 2) * 3);
  303.   end;
  304.   SetTextJustify(LeftText, TopText);
  305.   WaitToGo;
  306. end; { FillStylePlay }
  307.  
  308. procedure FillPatternPlay;
  309. { Display some user defined fill patterns }
  310. const
  311.   Patterns : array[0..11] of FillPatternType = (
  312.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  313.             OldColor which has a path of pixels of OldColor or NewColor
  314.             with sides touching back to the seed point, (XSeed, YSeed).
  315.             Therefore, only pixels of OldColor are modified and no other
  316.             information is changed.
  317.  
  318.             SEE ALSO
  319.  
  320.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  321.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  322.             SETVIEW
  323.  
  324.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  325.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  326.             IF WHICHVGA = 0 THEN STOP
  327.             DUMMY=RES640
  328.             SETVIEW 100, 100, 539, 379
  329.             FILLVIEW 10
  330.             WHILE INKEY$ = ""
  331.             WEND
  332.             VIDEOMODESET VMODE
  333.             END
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.  
  347.  
  348.  
  349.  
  350.                                                                          63
  351.  
  352.  
  353.  
  354.  
  355.  
  356.  
  357.           FONTGETINFO
  358.  
  359.             PROTOTYPE
  360.  
  361.             SUB FONTGETINFO (Width%, Height%)
  362.  
  363.             INPUT
  364.  
  365.             no input parameters
  366.     WEND
  367.             MOUSEEXIT
  368.             VIDEOMODESET VMODE
  369.             END
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391.  
  392.  
  393.  
  394.  
  395.  
  396.  
  397.  
  398.  
  399.  
  400.  
  401.  
  402.  
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.                                                                          86
  411.  
  412.  
  413.  
  414.  
  415.  
  416.  
  417.           MOUSECURSORDEFAULT
  418.  
  419.             PROTOTYPE
  420.  
  421.             SUB MOUSECURSORDEFAULT ()
  422.  
  423.             INPUT
  424.  
  425.             no input parameters
  426.  
  427.             OUTPUT
  428.  
  429.             no value returned
  430.  
  431.             USAGE
  432.  
  433.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  434.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4
  435. ²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  436. ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$
  437. ░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  438. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  439. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  440. $╤
  441. #@Ñú4,p&e÷ü¼_ÇQºÑ4
  442. òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±
  443. ░┤ÖÇD└D0Å╡`   $ «îO@╧1
  444. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  445. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S
  446. ╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩
  447. ░£▒
  448. Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa
  449. ≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  450.       end;
  451.     end;
  452.   end;
  453.   WaitToGo;
  454. end; { UserLineStylePlay }
  455.  
  456.  
  457. procedure SayGoodbye;
  458. { Say goodbye and then exit the program }
  459. var
  460.   ViewInfo : ViewPortType;
  461. begin
  462.   MainWindow('');
  463.   GetViewSettings(ViewInfo);
  464.   SetTextStyle(TriplexFont, HorizDir, 4);
  465.   SetTextJustify(CenterText, CenterText);
  466.   with ViewInfo do
  467.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  468.   StatusLine('Press any key to quit...');
  469.   repeat until KeyPressed;
  470. end; { SayGoodbye }
  471.  
  472.  
  473. PROCEDURE SelectMode;
  474. VAR
  475.     choice1,choice2     : CHAR;
  476.    xsize,ysize            : WORD;
  477. BEGIN
  478.     (* Let's select a mode *)
  479.     ClrScr;
  480.     WriteLn('VESADEMO:');
  481.     WriteLn('1. 256 colors');
  482.     WriteLn('2. 32768 colors');
  483.     WriteLn('3. 65536 colors');
  484.     WriteLn('4. 16777216 colors');
  485.     WriteLn('Q uit');
  486.     WriteLn;
  487.     Write('Your choice: ');
  488.     REPEAT
  489.         ReadLn(choice1);
  490.       IF choice1 <> '1' THEN BEGIN
  491.           WriteLn('Sorry !');
  492.          WriteLn('This demo wasn''t written for more as 256 colors !');
  493.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  494.          WriteLn('Switching to 256 colors.');
  495.          choice1 := '1';
  496.       END;
  497.     UNTIL choice1 IN ['1'..'4','q'];
  498.     IF choice1 = 'q' THEN Halt;
  499.  
  500.     WriteLn;
  501.     WriteLn;
  502.     WriteLn('a. 320x200');
  503.     WriteLn('b. 640x480');
  504.     WriteLn('c. 800x600');
  505.     WriteLn('d. 1024x768');
  506.     WriteLn('e. 1280x1024');
  507.     WriteLn('Q uit');
  508.     WriteLn;
  509.     Write('Your choice: ');
  510.     REPEAT
  511.         ReadLn(choice2);
  512.     UNTIL choice2 IN ['a'..'e','q'];
  513.     IF choice2 = 'q' THEN Halt;
  514.  
  515.     CASE choice2 OF
  516.         'a' : BEGIN
  517.             xsize := 320;
  518.             ysize := 200;
  519.         END;
  520.         'b' : BEGIN
  521.             xsize := 640;
  522.             ysize := 480;
  523.         END;
  524.         'c' : BEGIN
  525.             xsize := 800;
  526.             ysize := 600;
  527.         END;
  528.         'd' : BEGIN
  529.             xsize := 1024;
  530.             ysize := 768;
  531.         END;
  532.         'e' : BEGIN
  533.             xsize := 1280;
  534.             ysize := 1024;
  535.         END;
  536.     END;
  537.     CASE choice1 OF
  538.         '1' : mode := FindVesaMode(xsize,ysize,8);
  539.         '2' : mode := FindVesaMode(xsize,ysize,15);
  540.         '3' : mode := FindVesaMode(xsize,ysize,16);
  541.         '4' : mode := FindVesaMode(xsize,ysize,24);
  542.     END;
  543.     IF mode = 0 THEN BEGIN
  544.         WriteLn('No such mode could be found !');
  545.         WriteLn('Switching to to 320x200.');
  546.         ReadKey;
  547.         mode := V320x200x256;
  548.     END;
  549. END;
  550.  
  551. begin { program body }
  552.   SelectMode;
  553.   Initialize;
  554.   ReportStatus;
  555.  
  556. {  AspectRatioPlay; }
  557.   FillEllipsePlay;
  558.   SectorPlay;
  559.   WriteModePlay;
  560.  
  561.   ColorPlay;
  562.   { PalettePlay only intended to work on these drivers: }
  563.   if (GraphDriver = EGA) or
  564.       (GraphDriver = EGA64) or
  565.       (GraphDriver = VGA) then
  566.      PalettePlay;
  567.   PutPixelPlay;
  568. {  PutImagePlay; }
  569.   RandBarPlay;
  570.   BarPlay;
  571.   Bar3DPlay;
  572.   ArcPlay;
  573.   CirclePlay;
  574.   PiePlay;
  575.   LineToPlay;
  576.   LineRelPlay;
  577. {  LineStylePlay; }
  578. {  UserLineStylePlay; }
  579.   TextDump;
  580.   TextPlay;
  581.   CrtModePlay;
  582.   FillStylePlay;
  583.   FillPatternPlay;
  584.   PolyPlay;
  585.   SayGoodbye;
  586. {  CloseGraph; }
  587.   CloseVesa;
  588. end.
  589. ***************************************************
  590.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  591.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩
  592. ¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·
  593. Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  594. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  595. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  596.     Color := RandColor;
  597.     SetColor(Color);
  598.     SetFillStyle(Random(CloseDotFill)+1, Color);
  599.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  600.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  601.   until KeyPressed;
  602.   WaitToGo;
  603. end; { RandBarPlay }
  604.  
  605. procedure ArcPlay;
  606. { Draw random arcs on the screen }
  607. var
  608.   MaxRadius : word;
  609.   EndAngle : word;
  610.   ArcInfo : ArcCoordsType;
  611. begin
  612.   MainWindow('Arc / GetArcCoords demonstration');
  613.   StatusLine('Esc aborts or press a key');
  614.   MaxRadius := MaxY div 10;
  615.   repeat
  616.     SetColor(RandColor);
  617.     EndAngle := Random(360);
  618.     SetLineStyle(SolidLn, 0, NormWidth);
  619.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  620.     GetArcCoords(ArcInfo);
  621.     with ArcInfo do
  622.     begin
  623.       Line(X, Y, XStart, YStart);
  624.       Line(X, Y, Xend, Yend);
  625.     end;
  626.   until KeyPressed;
  627.   WaitToGo;
  628. end; { ArcPlay }
  629.  
  630. procedure PutPixelPlay;
  631. { Demonstrate the PutPixel and GetPixel commands }
  632. const
  633.   Seed   = 1962; { A seed for the random number generator }
  634.   NumPts = 2000; { The number of pixels plotted }
  635.   Esc    = #27;
  636. var
  637.   I : word;
  638.   X, Y, Color : word;
  639.   XMax, YMax  : integer;
  640.   ViewInfo    : ViewPortType;
  641. begin
  642.   MainWindow('PutPixel / GetPixel demonstration');
  643.   StatusLine('Esc aborts or press a key...');
  644.  
  645.   GetViewSettings(ViewInfo);
  646.   with ViewInfo do
  647.   begin
  648.     XMax := (x2-x1-1);
  649.     YMax := (y2-y1-1);
  650.   end;
  651.  
  652.   while not KeyPressed do
  653.   begin
  654.     { Plot random pixels }
  655.     RandSeed := Seed;
  656.     I := 0;
  657.     while (not KeyPressed) and (I < NumPts) do
  658.     begin
  659.       Inc(I);
  660.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  661.     end;
  662.  
  663.     { Erase pixels }
  664.     RandSeed := Seed;
  665.     I := 0;
  666.     while (not KeyPressed) and (I < NumPts) do
  667.     begin
  668.       Inc(I);
  669.       X := Random(XMax)+1;
  670.       Y := Random(YMax)+1;
  671.       Color := GetPixel(X, Y);
  672.         if Color = RandColor then
  673.           PutPixel(X, Y, 0);
  674.      end;
  675.   end;
  676.   WaitToGo;
  677. end; { PutPixelPlay }
  678.  
  679. procedure PutImagePlay;
  680. { Demonstrate the GetImage and PutImage commands }
  681.  
  682. const
  683.   r  = 20;
  684.   StartX = 100;
  685.   StartY = 50;
  686.  
  687. var
  688.   CurPort : ViewPortType;
  689.  
  690. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  691. var
  692.   Step : integer;
  693. begin
  694.   Step := Random(2*r);
  695.   if Odd(Step) then
  696.     Step := -Step;
  697.   X := X + Step;
  698.   Step := Random(r);
  699.   if Odd(Step) then
  700.     Step := -Step;
  701.   Y := Y + Step;
  702.  
  703.   { Make saucer bounce off viewport walls }
  704.   with CurPort do
  705.   begin
  706.     if (x1 + X + Width - 1 > x2) then
  707.       X := x2-x1 - Width + 1
  708.     else
  709.       if (X < 0) then
  710.         X := 0;
  711.     if (y1 + Y + Height - 1 > y2) then
  712.       Y := y2-y1 - Height + 1
  713.     else
  714.       if (Y < 0) then
  715.         Y := 0;
  716.   end;
  717. end; { MoveSaucer }
  718.  
  719. var
  720.   Pausetime : word;
  721.   Saucer    : pointer;
  722.   X, Y      : integer;
  723.   ulx, uly  : word;
  724.   lrx, lry  : word;
  725.   Size      : word;
  726.   I         : word;
  727. begin
  728.   ClearDevice;
  729.   FullPort;
  730.  
  731.   { PaintScreen }
  732.   ClearDevice;
  733.   MainWindow('GetImage / PutImage Demonstration');
  734.   StatusLine('Esc aborts or press a key...');
  735.   GetViewSettings(CurPort);
  736.  
  737.   { DrawSaucer }
  738.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  739.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  740.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  741.   Circle(StartX+10, StartY-12, 2);
  742.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  743.   Circle(StartX-10, StartY-12, 2);
  744.   SetFillStyle(SolidFill, MaxColor);
  745.   FloodFill(StartX+1, StartY+4, GetColor);
  746.  
  747.   { ReadSaucerImage }
  748.   ulx := StartX-(r+1);
  749.   uly := StartY-14;
  750.   lrx := StartX+(r+1);
  751.   lry := StartY+(r div 3)+3;
  752.  
  753.   Size := ImageSize(ulx, uly, lrx, lry);
  754.   GetMem(Saucer, Size);
  755.   GetImage(ulx, uly, lrx, lry, Saucer^);
  756. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  757.  
  758.   { Plot some "stars" }
  759.   for I := 1 to 1000 do
  760.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  761.   X := MaxX div 2;
  762.   Y := MaxY div 2;
  763.   PauseTime := 70;
  764.  
  765.   { Move the saucer around }
  766.   repeat
  767. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  768.      Delay(PauseTime);
  769. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  770.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  771.   until KeyPressed;
  772.   FreeMem(Saucer, size);
  773.   WaitToGo;
  774. end; { PutImagePlay }
  775.  
  776. procedure PolyPlay;
  777. { Draw random polygons with random fill styles on the screen }
  778. const
  779.   MaxPts = 5;
  780. type
  781.   PolygonType = array[1..MaxPts] of PointType;
  782. var
  783.   Poly : PolygonType;
  784.   I, Color : word;
  785. begin
  786.   MainWindow('FillPoly demonstration');
  787.   StatusLine('Esc aborts or press a key...');
  788.   repeat
  789.     Color := RandColor;
  790.     SetFillStyle(Random(11)+1, Color);
  791.     SetColor(Color);
  792.     for I := 1 to MaxPts do
  793.       with Poly[I] do
  794.       begin
  795.         X := Random(MaxX);
  796.         Y := Random(MaxY);
  797.       end;
  798.     FillPoly(MaxPts, Poly);
  799.   until KeyPressed;
  800.   WaitToGo;
  801. end; { PolyPlay }
  802.  
  803. procedure FillStylePlay;
  804. { Display all of the predefined fill styles available }
  805. var
  806.   Style    : word;
  807.   Width    : word;
  808.   Height   : word;
  809.   X, Y     : word;
  810.   I, J     : word;
  811.   ViewInfo : ViewPortType;
  812.  
  813. procedure DrawBox(X, Y : word);
  814. begin
  815.   SetFillStyle(Style, MaxColor);
  816.   with ViewInfo do
  817.     Bar(X, Y, X+Width, Y+Height);
  818.   Rectangle(X, Y, X+Width, Y+Height);
  819.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  820.   Inc(Style);
  821. end; { DrawBox }
  822.  
  823. begin
  824.   MainWindow('Pre-defined fill styles');
  825.   GetViewSettings(ViewInfo);
  826.   with ViewInfo do
  827.   begin
  828.     Width := 2 * ((x2+1) div 13);
  829.     Height := 2 * ((y2-10) div 10);
  830.   end;
  831.   X := Width div 2;
  832.   Y := Height div 2;
  833.   Style := 0;
  834.   for J := 1 to 3 do
  835.   begin
  836.     for I := 1 to 4 do
  837.     begin
  838.       DrawBox(X, Y);
  839.       Inc(X, (Width div 2) * 3);
  840.     end;
  841.     X := Width div 2;
  842.     Inc(Y, (Height div 2) * 3);
  843.   end;
  844.   SetTextJustify(LeftText, TopText);
  845.   WaitToGo;
  846. end; { FillStylePlay }
  847.  
  848. procedure FillPatternPlay;
  849. { Display some user defined fill patterns }
  850. const
  851.   Patterns : array[0..11] of FillPatternType = (
  852.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  853.             OldColor which has a path of pixels of OldColor or NewColor
  854.             with sides touching back to the seed point, (XSeed, YSeed).
  855.             Therefore, only pixels of OldColor are modified and no other
  856.             information is changed.
  857.  
  858.             SEE ALSO
  859.  
  860.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  861.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  862.             SETVIEW
  863.  
  864.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  865.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  866.             IF WHICHVGA = 0 THEN STOP
  867.             DUMMY=RES640
  868.             SETVIEW 100, 100, 539, 379
  869.             FILLVIEW 10
  870.             WHILE INKEY$ = ""
  871.             WEND
  872.             VIDEOMODESET VMODE
  873.             END
  874.  
  875.  
  876.  
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.  
  885.  
  886.  
  887.  
  888.  
  889.  
  890.                                                                          63
  891.  
  892.  
  893.  
  894.  
  895.  
  896.  
  897.           FONTGETINFO
  898.  
  899.             PROTOTYPE
  900.  
  901.             SUB FONTGETINFO (Width%, Height%)
  902.  
  903.             INPUT
  904.  
  905.             no input parameters
  906.     WEND
  907.             MOUSEEXIT
  908.             VIDEOMODESET VMODE
  909.             END
  910.  
  911.  
  912.  
  913.  
  914.  
  915.  
  916.  
  917.  
  918.  
  919.  
  920.  
  921.  
  922.  
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.  
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937.  
  938.  
  939.  
  940.  
  941.  
  942.  
  943.  
  944.  
  945.  
  946.  
  947.  
  948.  
  949.  
  950.                                                                          86
  951.  
  952.  
  953.  
  954.  
  955.  
  956.  
  957.           MOUSECURSORDEFAULT
  958.  
  959.             PROTOTYPE
  960.  
  961.             SUB MOUSECURSORDEFAULT ()
  962.  
  963.             INPUT
  964.  
  965.             no input parameters
  966.  
  967.             OUTPUT
  968.  
  969.             no value returned
  970.  
  971.             USAGE
  972.  
  973.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  974.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4
  975. ²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  976. ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$
  977. ░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  978. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  979. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  980. $╤
  981. #@Ñú4,p&e÷ü¼_ÇQºÑ4
  982. òQ  ü@;¡_áQ@e╠≥@mp!┤a╘O░√`Pñź ÇT°8ÿ!¼Åñ$½╙"q¿ PñCÇ¿α√└╥░eT"ß<p°%Pæ(╧%pδ¥/OêW0Ǽbφ φ B@[â¼8â≥µ≤(    ¿⌡%(Ç∩áTÿp+ óÜ▓0!Σ±(1±
  983. ░┤ÖÇD└D0Å╡`   $ «îO@╧1
  984. a╝╤j-0ñ│`@╖bΦaT1═⌠╝╤Σ²¼±,1öíî9lÿ28ÇÅ`Γî¿P²$,N0┴O0a╫δ≤0σú`°î╖#0δ≡└X▄1»Σî(▒¥Ç█Ñ"qá√1CÇú╟╨º Å
  985. FT Θ²î└1ÇY0    w ²à░$@AÅ`╦Φ¼╘`▄1A  }┐Ç*5 ΩSδδî`¼îaδæ¼î5 1¿⌡Ω╜⌠ ¼¥╬ü└Qî1S
  986. ╛≤î9╨iÇ,∙PU(}Ç$üÇ àÇ`σìÇ`QαÜBO$%ÿÇ╧"$Ç«Ç]É.┬\`%WÉ$  W0 ÄâO0]αG┬ur╩
  987. ░£▒
  988. Q¢ú╔Ç≡°s?`X0╘`@ µWâ@╣aá εdq`¥9?Ç&+o0µyÄΣAÅuV(7P╬±@IdQ╕@Å┤@;Ç▓?Çò│CÇ┤╟╨╡KÇÄ30ⁿφ° ó╬ì+]Ä╦≡     Mö╝σ ²y5<!└▀óâ╝É3~mp    $<╛≤9Æ-2ⁿ≡@T,╞Σa,)Pæ└¥#¼╪Q┤S(¼@Aîa
  989. ≡╤@Ö²±⌠KëD─┴▒▀0╨Ñ$╩-0 ╨ê*╙▓edm`î=3Kß-10è=≥≤²└£mîjy ÿe²ⁿ╨i╕e▓ΣmαÖ╢C%Ç*ê*0 EátQZ`mÄLP%    °üⁿªüNQ∙  T¿<qtWΩc z░ÅÇñΩçǪçÇ«;└<┐á¼¥. á?<Σscî)áí := 0;
  990.       end;
  991.     end;
  992.   end;
  993.   WaitToGo;
  994. end; { UserLineStylePlay }
  995.  
  996.  
  997. procedure SayGoodbye;
  998. { Say goodbye and then exit the program }
  999. var
  1000.   ViewInfo : ViewPortType;
  1001. begin
  1002.   MainWindow('');
  1003.   GetViewSettings(ViewInfo);
  1004.   SetTextStyle(TriplexFont, HorizDir, 4);
  1005.   SetTextJustify(CenterText, CenterText);
  1006.   with ViewInfo do
  1007.     OutTextXY((x2-x1) div 2, (y2-y1) div 2, 'That''s all folks!');
  1008.   StatusLine('Press any key to quit...');
  1009.   repeat until KeyPressed;
  1010. end; { SayGoodbye }
  1011.  
  1012.  
  1013. PROCEDURE SelectMode;
  1014. VAR
  1015.     choice1,choice2     : CHAR;
  1016.    xsize,ysize            : WORD;
  1017. BEGIN
  1018.     (* Let's select a mode *)
  1019.     ClrScr;
  1020.     WriteLn('VESADEMO:');
  1021.     WriteLn('1. 256 colors');
  1022.     WriteLn('2. 32768 colors');
  1023.     WriteLn('3. 65536 colors');
  1024.     WriteLn('4. 16777216 colors');
  1025.     WriteLn('Q uit');
  1026.     WriteLn;
  1027.     Write('Your choice: ');
  1028.     REPEAT
  1029.         ReadLn(choice1);
  1030.       IF choice1 <> '1' THEN BEGIN
  1031.           WriteLn('Sorry !');
  1032.          WriteLn('This demo wasn''t written for more as 256 colors !');
  1033.          WriteLn('You would only get a limited impression of the Hi-& TrueColor modes...');
  1034.          WriteLn('Switching to 256 colors.');
  1035.          choice1 := '1';
  1036.       END;
  1037.     UNTIL choice1 IN ['1'..'4','q'];
  1038.     IF choice1 = 'q' THEN Halt;
  1039.  
  1040.     WriteLn;
  1041.     WriteLn;
  1042.     WriteLn('a. 320x200');
  1043.     WriteLn('b. 640x480');
  1044.     WriteLn('c. 800x600');
  1045.     WriteLn('d. 1024x768');
  1046.     WriteLn('e. 1280x1024');
  1047.     WriteLn('Q uit');
  1048.     WriteLn;
  1049.     Write('Your choice: ');
  1050.     REPEAT
  1051.         ReadLn(choice2);
  1052.     UNTIL choice2 IN ['a'..'e','q'];
  1053.     IF choice2 = 'q' THEN Halt;
  1054.  
  1055.     CASE choice2 OF
  1056.         'a' : BEGIN
  1057.             xsize := 320;
  1058.             ysize := 200;
  1059.         END;
  1060.         'b' : BEGIN
  1061.             xsize := 640;
  1062.             ysize := 480;
  1063.         END;
  1064.         'c' : BEGIN
  1065.             xsize := 800;
  1066.             ysize := 600;
  1067.         END;
  1068.         'd' : BEGIN
  1069.             xsize := 1024;
  1070.             ysize := 768;
  1071.         END;
  1072.         'e' : BEGIN
  1073.             xsize := 1280;
  1074.             ysize := 1024;
  1075.         END;
  1076.     END;
  1077.     CASE choice1 OF
  1078.         '1' : mode := FindVesaMode(xsize,ysize,8);
  1079.         '2' : mode := FindVesaMode(xsize,ysize,15);
  1080.         '3' : mode := FindVesaMode(xsize,ysize,16);
  1081.         '4' : mode := FindVesaMode(xsize,ysize,24);
  1082.     END;
  1083.     IF mode = 0 THEN BEGIN
  1084.         WriteLn('No such mode could be found !');
  1085.         WriteLn('Switching to to 320x200.');
  1086.         ReadKey;
  1087.         mode := V320x200x256;
  1088.     END;
  1089. END;
  1090.  
  1091. begin { program body }
  1092.   SelectMode;
  1093.   Initialize;
  1094.   ReportStatus;
  1095.  
  1096. {  AspectRatioPlay; }
  1097.   FillEllipsePlay;
  1098.   SectorPlay;
  1099.   WriteModePlay;
  1100.  
  1101.   ColorPlay;
  1102.   { PalettePlay only intended to work on these drivers: }
  1103.   if (GraphDriver = EGA) or
  1104.       (GraphDriver = EGA64) or
  1105.       (GraphDriver = VGA) then
  1106.      PalettePlay;
  1107.   PutPixelPlay;
  1108. {  PutImagePlay; }
  1109.   RandBarPlay;
  1110.   BarPlay;
  1111.   Bar3DPlay;
  1112.   ArcPlay;
  1113.   CirclePlay;
  1114.   PiePlay;
  1115.   LineToPlay;
  1116.   LineRelPlay;
  1117. {  LineStylePlay; }
  1118. {  UserLineStylePlay; }
  1119.   TextDump;
  1120.   TextPlay;
  1121.   CrtModePlay;
  1122.   FillStylePlay;
  1123.   FillPatternPlay;
  1124.   PolyPlay;
  1125.   SayGoodbye;
  1126. {  CloseGraph; }
  1127.   CloseVesa;
  1128. end.
  1129. ***************************************************
  1130.     '* SHOW D2ROTATE (ABOUT THE ORIGIN)
  1131.     '****************************************************************∞╥≤c≤*φè#^│v/╒:j═φ0t+l▓ô"¬"g└≡?%ªêΣ│H╫½╫╜├¿U'╒⌐⌡ ßV?╩
  1132. ¬ujOΦçEZ1∞▐! ▄B╛Σ8║æ]1GlNÜ┐q▌▓;ô$ΦzE<cª*bEô#ä╧ñÅ"∩─LrdaÖ ╠º╫a^¥£å╬1~)@ëÖMδ╫0═6DäFê¬Çv┼ß╨kæpτ╪É)}ª 1w3╤╧ü⌡¥╓h▓╣≈ïÅaÑ[TⁿHqªÉ╝DKÄ─Y-∞tT╤Θ╨º╟╪.*ÇI9lΦ≈{πτcσ$τπßoFr╪╨∩┼╞╟;O2■e²LÜ4^N|╪½ÅO?╔°FOz`╟╟╟'<>>π$πΘù6·
  1133. Xgî╖│°oîδπGƒd╝▀░?■╪╔_9L ⌡ôⁿq'æO▀ƒn4╔▀╚▄┼3pτ.òO°·}÷╕ⁿ±'æO?ít│!√8ßÑ≤/┐╣p┼≥┘E╦Vox╕cΦé5╟╚º╙$?√$≥ΘZεsî≡åìΓpKù¢ïß X╥ 9╞≈\µk┤O¥_ 5Üö\≤éÄ┌╤A[╤ÿáï┼éNⁿÅu16    g,%hc╙╨cD╨Vï┘R¢öKñR;8εáΣ╢╪ós╤π╡á└èxgzPÄMú╫yαºÉ+σJ¢i+▓â3╥    ═Ñ╙î^ºG▓█πérφçs %#(╗⌠?┼%u8≡6+QÉ))ò)Afw≈╣╪)B&4░åLXV:δät@Å.;5Φf╢Ät┐ΣJ╫─U8úÇ╟éö£╕p╔┴⌠vg╨╬╥é÷╪╣┬ΓI.ç≡^v╤ZΦÇ& ╒┌6ñô6XßNè╡╬E₧Ñ
  1134. kIº╠▄A+╣╥éb²tæ-Y¡½αÑa═uuîÇ╢αêvhuª╡SÅ┤vèùú¥F;p<d⌐/F─d█éT%▓KΦû=q■öI┐ ┐╠6S$▒÷╚ENΩ¥Fû9╔┌R'╝ ╧φ└?g┬j▓0═/b╖₧─mûé╢┌»ÿÄë/·<éò■░╤╟╢├Xσ:╥P3Θ"╬Læsφ░┌öSö!╗¿*mN£WΣÇ£┤~#╗ææ≥RΩóh:à▌.æ≈╕▌v£äàd▒à╒├=░╖π║$howeg*╬    6ù▄ƒô╕φ░Ö╢qΘD>(w@úKεHÆ╛öúΣU
  1135. éÜR╔╤W▄èê 2M%ó.▓SNÖA1ùJE╢║l]▓¿>\%└Å4ßO▄£â⌐& ê/)8vSP▀▓ôⁿææ√ü√ÑÄa⌠â╚4S╓╟P- ?Σá╕▓Næ*q╡UΘ▓≈^ñ·I.rúR&$Y^╚%è≡B┌≈Ceat
  1136.     Color := RandColor;
  1137.     SetColor(Color);
  1138.     SetFillStyle(Random(CloseDotFill)+1, Color);
  1139.     Bar3D(Random(MaxWidth), Random(MaxHeight),
  1140.           Random(MaxWidth), Random(MaxHeight), 0, TopOff);
  1141.   until KeyPressed;
  1142.   WaitToGo;
  1143. end; { RandBarPlay }
  1144.  
  1145. procedure ArcPlay;
  1146. { Draw random arcs on the screen }
  1147. var
  1148.   MaxRadius : word;
  1149.   EndAngle : word;
  1150.   ArcInfo : ArcCoordsType;
  1151. begin
  1152.   MainWindow('Arc / GetArcCoords demonstration');
  1153.   StatusLine('Esc aborts or press a key');
  1154.   MaxRadius := MaxY div 10;
  1155.   repeat
  1156.     SetColor(RandColor);
  1157.     EndAngle := Random(360);
  1158.     SetLineStyle(SolidLn, 0, NormWidth);
  1159.     Arc(Random(MaxX), Random(MaxY), Random(EndAngle), EndAngle, Random(MaxRadius));
  1160.     GetArcCoords(ArcInfo);
  1161.     with ArcInfo do
  1162.     begin
  1163.       Line(X, Y, XStart, YStart);
  1164.       Line(X, Y, Xend, Yend);
  1165.     end;
  1166.   until KeyPressed;
  1167.   WaitToGo;
  1168. end; { ArcPlay }
  1169.  
  1170. procedure PutPixelPlay;
  1171. { Demonstrate the PutPixel and GetPixel commands }
  1172. const
  1173.   Seed   = 1962; { A seed for the random number generator }
  1174.   NumPts = 2000; { The number of pixels plotted }
  1175.   Esc    = #27;
  1176. var
  1177.   I : word;
  1178.   X, Y, Color : word;
  1179.   XMax, YMax  : integer;
  1180.   ViewInfo    : ViewPortType;
  1181. begin
  1182.   MainWindow('PutPixel / GetPixel demonstration');
  1183.   StatusLine('Esc aborts or press a key...');
  1184.  
  1185.   GetViewSettings(ViewInfo);
  1186.   with ViewInfo do
  1187.   begin
  1188.     XMax := (x2-x1-1);
  1189.     YMax := (y2-y1-1);
  1190.   end;
  1191.  
  1192.   while not KeyPressed do
  1193.   begin
  1194.     { Plot random pixels }
  1195.     RandSeed := Seed;
  1196.     I := 0;
  1197.     while (not KeyPressed) and (I < NumPts) do
  1198.     begin
  1199.       Inc(I);
  1200.         PutPixel(Random(XMax)+1, Random(YMax)+1, RandColor);
  1201.     end;
  1202.  
  1203.     { Erase pixels }
  1204.     RandSeed := Seed;
  1205.     I := 0;
  1206.     while (not KeyPressed) and (I < NumPts) do
  1207.     begin
  1208.       Inc(I);
  1209.       X := Random(XMax)+1;
  1210.       Y := Random(YMax)+1;
  1211.       Color := GetPixel(X, Y);
  1212.         if Color = RandColor then
  1213.           PutPixel(X, Y, 0);
  1214.      end;
  1215.   end;
  1216.   WaitToGo;
  1217. end; { PutPixelPlay }
  1218.  
  1219. procedure PutImagePlay;
  1220. { Demonstrate the GetImage and PutImage commands }
  1221.  
  1222. const
  1223.   r  = 20;
  1224.   StartX = 100;
  1225.   StartY = 50;
  1226.  
  1227. var
  1228.   CurPort : ViewPortType;
  1229.  
  1230. procedure MoveSaucer(var X, Y : integer; Width, Height : integer);
  1231. var
  1232.   Step : integer;
  1233. begin
  1234.   Step := Random(2*r);
  1235.   if Odd(Step) then
  1236.     Step := -Step;
  1237.   X := X + Step;
  1238.   Step := Random(r);
  1239.   if Odd(Step) then
  1240.     Step := -Step;
  1241.   Y := Y + Step;
  1242.  
  1243.   { Make saucer bounce off viewport walls }
  1244.   with CurPort do
  1245.   begin
  1246.     if (x1 + X + Width - 1 > x2) then
  1247.       X := x2-x1 - Width + 1
  1248.     else
  1249.       if (X < 0) then
  1250.         X := 0;
  1251.     if (y1 + Y + Height - 1 > y2) then
  1252.       Y := y2-y1 - Height + 1
  1253.     else
  1254.       if (Y < 0) then
  1255.         Y := 0;
  1256.   end;
  1257. end; { MoveSaucer }
  1258.  
  1259. var
  1260.   Pausetime : word;
  1261.   Saucer    : pointer;
  1262.   X, Y      : integer;
  1263.   ulx, uly  : word;
  1264.   lrx, lry  : word;
  1265.   Size      : word;
  1266.   I         : word;
  1267. begin
  1268.   ClearDevice;
  1269.   FullPort;
  1270.  
  1271.   { PaintScreen }
  1272.   ClearDevice;
  1273.   MainWindow('GetImage / PutImage Demonstration');
  1274.   StatusLine('Esc aborts or press a key...');
  1275.   GetViewSettings(CurPort);
  1276.  
  1277.   { DrawSaucer }
  1278.   Ellipse(StartX, StartY, 0, 360, r, (r div 3)+2);
  1279.   Ellipse(StartX, StartY-4, 190, 357, r, r div 3);
  1280.   Line(StartX+7, StartY-6, StartX+10, StartY-12);
  1281.   Circle(StartX+10, StartY-12, 2);
  1282.   Line(StartX-7, StartY-6, StartX-10, StartY-12);
  1283.   Circle(StartX-10, StartY-12, 2);
  1284.   SetFillStyle(SolidFill, MaxColor);
  1285.   FloodFill(StartX+1, StartY+4, GetColor);
  1286.  
  1287.   { ReadSaucerImage }
  1288.   ulx := StartX-(r+1);
  1289.   uly := StartY-14;
  1290.   lrx := StartX+(r+1);
  1291.   lry := StartY+(r div 3)+3;
  1292.  
  1293.   Size := ImageSize(ulx, uly, lrx, lry);
  1294.   GetMem(Saucer, Size);
  1295.   GetImage(ulx, uly, lrx, lry, Saucer^);
  1296. {  PutImage(ulx, uly, Saucer^, XORput);               { erase image }
  1297.  
  1298.   { Plot some "stars" }
  1299.   for I := 1 to 1000 do
  1300.      PutPixel(Random(MaxX), Random(MaxY), RandColor);
  1301.   X := MaxX div 2;
  1302.   Y := MaxY div 2;
  1303.   PauseTime := 70;
  1304.  
  1305.   { Move the saucer around }
  1306.   repeat
  1307. {     PutImage(X, Y, Saucer^, XORput);                 { draw image }
  1308.      Delay(PauseTime);
  1309. {     PutImage(X, Y, Saucer^, XORput);                 { erase image }
  1310.      MoveSaucer(X, Y, lrx - ulx + 1, lry - uly + 1);  { width/height }
  1311.   until KeyPressed;
  1312.   FreeMem(Saucer, size);
  1313.   WaitToGo;
  1314. end; { PutImagePlay }
  1315.  
  1316. procedure PolyPlay;
  1317. { Draw random polygons with random fill styles on the screen }
  1318. const
  1319.   MaxPts = 5;
  1320. type
  1321.   PolygonType = array[1..MaxPts] of PointType;
  1322. var
  1323.   Poly : PolygonType;
  1324.   I, Color : word;
  1325. begin
  1326.   MainWindow('FillPoly demonstration');
  1327.   StatusLine('Esc aborts or press a key...');
  1328.   repeat
  1329.     Color := RandColor;
  1330.     SetFillStyle(Random(11)+1, Color);
  1331.     SetColor(Color);
  1332.     for I := 1 to MaxPts do
  1333.       with Poly[I] do
  1334.       begin
  1335.         X := Random(MaxX);
  1336.         Y := Random(MaxY);
  1337.       end;
  1338.     FillPoly(MaxPts, Poly);
  1339.   until KeyPressed;
  1340.   WaitToGo;
  1341. end; { PolyPlay }
  1342.  
  1343. procedure FillStylePlay;
  1344. { Display all of the predefined fill styles available }
  1345. var
  1346.   Style    : word;
  1347.   Width    : word;
  1348.   Height   : word;
  1349.   X, Y     : word;
  1350.   I, J     : word;
  1351.   ViewInfo : ViewPortType;
  1352.  
  1353. procedure DrawBox(X, Y : word);
  1354. begin
  1355.   SetFillStyle(Style, MaxColor);
  1356.   with ViewInfo do
  1357.     Bar(X, Y, X+Width, Y+Height);
  1358.   Rectangle(X, Y, X+Width, Y+Height);
  1359.   OutTextXY(X+(Width div 2), Y+Height+4, Int2Str(Style));
  1360.   Inc(Style);
  1361. end; { DrawBox }
  1362.  
  1363. begin
  1364.   MainWindow('Pre-defined fill styles');
  1365.   GetViewSettings(ViewInfo);
  1366.   with ViewInfo do
  1367.   begin
  1368.     Width := 2 * ((x2+1) div 13);
  1369.     Height := 2 * ((y2-10) div 10);
  1370.   end;
  1371.   X := Width div 2;
  1372.   Y := Height div 2;
  1373.   Style := 0;
  1374.   for J := 1 to 3 do
  1375.   begin
  1376.     for I := 1 to 4 do
  1377.     begin
  1378.       DrawBox(X, Y);
  1379.       Inc(X, (Width div 2) * 3);
  1380.     end;
  1381.     X := Width div 2;
  1382.     Inc(Y, (Height div 2) * 3);
  1383.   end;
  1384.   SetTextJustify(LeftText, TopText);
  1385.   WaitToGo;
  1386. end; { FillStylePlay }
  1387.  
  1388. procedure FillPatternPlay;
  1389. { Display some user defined fill patterns }
  1390. const
  1391.   Patterns : array[0..11] of FillPatternType = (
  1392.   ($AA, $55, $AA, $55, $AA, $55, $AA, $55 üÖü üÖü  !BBäx!!!BBäx!BBäx"""DDêp""DDêp>"""BBääêp""!"BDäêêp>IÉÆ|      ° @≥î>00>><Dêx  !BBäx""DDêp&<"DDêê&22TTêêê$> $< @äêp>          ⁿBBBB<  @@Ç****DDDDDDDU¬U¬U¬U¬U¬U¬U¬▌w▌w▌w▌w▌w▌w▌w°°°≥■°°≥≥■≥≥■■°°°    ≤  ≤  ≤≤         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       ;DDD;    $"Bdÿ>@@@>||>Ac]AAA1N"A""2,  `1NA"*III*<Bü üB<<BüüüB<A" \"QIE" < <BBBB  @@    ~ ?  @ÇB$$B ""A$$"AII6 üBr»$**IIII**ccregion.  The region is defined as any pixel of
  1393.             OldColor which has a path of pixels of OldColor or NewColor
  1394.             with sides touching back to the seed point, (XSeed, YSeed).
  1395.             Therefore, only pixels of OldColor are modified and no other
  1396.             information is changed.
  1397.  
  1398.             SEE ALSO
  1399.  
  1400.             DRWFILLBOX, DRWFILLCIRCLE, DRWFILLELLIPSE, FILLAREA,
  1401.             FILLCONVEXPOLY, FILLPAGE, FILLPOLY, FILLSCREEN, FILLVIEW,
  1402.             SETVIEW
  1403.  
  1404.             EXAMPL(HNxHHO$B<BBBB<$<BBBB<<BBBB<$BBBBBF:0BBBBF:$BBBF:B<""AAA""AAAAA"<B@@B<" <2\A">>xDDxDNDD <` <>BB= > <BBBB< BBBBF:2L\bBBBB&AaQIECA8$>""">0@@A>@@@ b$(. b$(*
  1405.     $    $    $DDDDDDD¬U¬U¬U¬U¬U¬U¬Uw▌w▌w▌w▌w▌w▌w▌°°°⌠ⁿ°°⌠⌠ⁿ⌠⌠ⁿⁿ°°°    ≈  ≈  ≈≈         °                     ≡≡≡≡≡≡≡≡≡≡≡≡≡≡       7HH7"B\DBBRL~BB@@@@@@?R~!!~?DDDD8BBBB|@@Ç>P>III>"AA""AAA"Uw<DDDD86II6"EIQ"\ @@ "AAAAA> >     hH02L2L$$<H(,$<>>>>>>>         VMODE=VIDEOMODEGET
  1406.             IF WHICHVGA = 0 THEN STOP
  1407.             DUMMY=RES640
  1408.             SETVIEW 100, 100, 539, 379
  1409.             FILLVIEW 10
  1410.             WHILE INKEY$ = ""
  1411.             WEND
  1412.             VIDEOMODESET VMODE
  1413.             END
  1414.  
  1415.  
  1416.  
  1417.  
  1418.  
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424.  
  1425.  
  1426.  
  1427.  
  1428.  
  1429.  
  1430.                                                                          63
  1431.  
  1432.  
  1433.  
  1434.  
  1435.  
  1436.  
  1437.           FONTGETINFO
  1438.  
  1439.             PROTOTYPE
  1440.  
  1441.             SUB FONTGETINFO (Width%, Height%)
  1442.  
  1443.             INPUT
  1444.  
  1445.             no input parameters
  1446.     WEND
  1447.             MOUSEEXIT
  1448.             VIDEOMODESET VMODE
  1449.             END
  1450.  
  1451.  
  1452.  
  1453.  
  1454.  
  1455.  
  1456.  
  1457.  
  1458.  
  1459.  
  1460.  
  1461.  
  1462.  
  1463.  
  1464.  
  1465.  
  1466.  
  1467.  
  1468.  
  1469.  
  1470.  
  1471.  
  1472.  
  1473.  
  1474.  
  1475.  
  1476.  
  1477.  
  1478.  
  1479.  
  1480.  
  1481.  
  1482.  
  1483.  
  1484.  
  1485.  
  1486.  
  1487.  
  1488.  
  1489.  
  1490.                                                                          86
  1491.  
  1492.  
  1493.  
  1494.  
  1495.  
  1496.  
  1497.           MOUSECURSORDEFAULT
  1498.  
  1499.             PROTOTYPE
  1500.  
  1501.             SUB MOUSECURSORDEFAULT ()
  1502.  
  1503.             INPUT
  1504.  
  1505.             no input parameters
  1506.  
  1507.             OUTPUT
  1508.  
  1509.             no value returned
  1510.  
  1511.             USAGE
  1512.  
  1513.             MOUSECURSORDEFAULT defines the mouse cursor to be a small
  1514.        ,K$╖┼╘╤░XQ)σ┤ö≡÷┴─┤àñT┘,╘¬àñX9╘⌠àñ\9╘UÜ╢≤`9╘4a╘d9╘UTa╘h9╘ta╘l9╘Uöa╘p9╘┤a╘t┘PT±x┴îÇ╖0▓ïα│ÅαU┤ôα╡ùα╢¢α╖úΓ╘pǺΓ╕¡αë ╚┴πì°sKÉφb<$⌡▌ë     φë φë I1φë  Eφë $YφÆë (mφë ,üφë 0$òφë á⌐φë ñ╜φë I¿╤φë ¼σφë ░∙φÆë 4
  1515. ²ë ┤!²ë ╕$5²ë ╝I²ë └]²ë ⌐8q²ë <àⁿΦiǬ∙PÖÇ ¥Ç
  1516. ░╨â@%8@ΓΦá╝╤░≡cÑÅ*$
  1517. ░╕≡ż≡τ╥m¿⌡ε    ╨@#µ≈$âh$âαra╨à`¥è∩Ç%Ç +─▀ TîcOî∩â°1<@  [$¿Ç¼ MMl·0ƒ Y¼─!%6a▐è ¥ì ßá+?±  P<îaTTV ╪iÇ¡≥░ `_ñ»%Çá᪠P█º»ε`éa∙É%H«┴íA%Gár∙É
  1518. iw∙Éiφ`╧≥≡╤Çmⁿ▒
  1519. ]ÆAáσw7░⌡∩    $·╟Ç√É&^`  ┐ $ⁿ  $■ $╒ nk$J-ÉQ1£PéBù »0αQ/Ñ4╜£░ºP≈Ñ4Ç⌡$(ª▀$@C]Æé≈└╕_SÇçÑ4=iÉ⌠ä╣<_np@Ñ45ò▒Y3ü¼Qí░.i>╠@5+┴╙É╛╙$@ #┴@«╦
  1520. $╤
  1521. #@Ñú4,p&e÷ü